package com.bzkj.basicinfo.service.inspect;

import com.bzkj.basicinfo.domain.inspect.WmsInspectDetailEntity;
import com.bzkj.basicinfo.domain.inspect.WmsInspectTaskEntity;
import com.bzkj.common.core.domain.AjaxResult;
import com.bzkj.common.core.page.TableDataInfo;

import java.util.List;
import java.util.Map;

public interface WmsInspectTaskService {
    /**
     * 获取验收任务列表
     */
    TableDataInfo getInspectTaskList(WmsInspectTaskEntity entity, Integer pageNum, Integer pageSize);

    /**
     * 获取验收任务详情
     */
    WmsInspectTaskEntity getInspectTaskDetail(Long id);

    /**
     * 创建验收任务
     */
    int createInspectTask(Long receiveOrderId, String inspectType);

    /**
     * 完成验收任务
     */
    int completeInspectTask(Long id);

    /**
     * 删除验收任务
     */
    int deleteInspectTask(Long id);

    /**
     * 获取待验收的收货单列表
     */
    TableDataInfo getPendingReceiveOrders(Map<String, Object> params);

    /**
     * 获取待验收的验收任务列表（用于验收界面选择）
     * @param params 查询参数
     * @return 验收任务列表（关联收货单信息）
     */
    TableDataInfo getPendingInspectTasks(Map<String, Object> params);

    /**
     * 获取收货单明细（用于验收）
     */
    Map<String, Object> getReceiveOrderDetailForInspect(Long receiveOrderId);

    /**
     * 根据商品ID获取货位信息
     */
    Map<String, Object> getShelfInfoByProduct(String productId);

    /**
     * 提交验收
     *
     * @param inspectTaskId  验收任务ID
     * @param receiveOrderNo
     * @param details        验收明细列表
     * @return 验收任务ID
     */
    Long submitInspect(Long inspectTaskId, String receiveOrderNo, List<WmsInspectDetailEntity> details);

    /**
     * 批量更新验收明细
     */
    int batchUpdateInspectDetails(List<WmsInspectDetailEntity> details);

    /**
     * 根据收货单创建验收任务（确认到货时调用）
     * @param receiveOrderId 收货单ID
     * @param receiveOrderNo 收货单号
     * @param operator 操作人
     * @return 验收任务ID
     */
    Long createInspectTaskForReceiveOrder(Long receiveOrderId, String receiveOrderNo, String operator);

    /**
     * 验收不通过处理（新增方法）
     * 将收货单状态回滚至「4 - 异常」，记录不通过原因、人员、时间
     * @param receiveOrderId 收货单ID
     * @param receiveOrderNo 收货单号
     * @param rejectReason 不通过原因
     * @param rejectDesc 详细描述
     * @param photoUrls 相关照片
     * @param operator 操作人
     * @return 操作结果
     */
    AjaxResult rejectInspect(Long receiveOrderId, String receiveOrderNo,
                           String rejectReason, String rejectDesc,
                           String photoUrls, String operator);

    /**
     * 异常收货单重新验收（新增方法）
     * 将异常状态的收货单重新设置为已到货待验收状态
     * @param receiveOrderId 收货单ID
     * @param operator 操作人
     * @return 操作结果
     */
    AjaxResult resetInspectStatus(Long receiveOrderId, String operator);
}
